package com.proxy.jdk;

import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class proxyTest {
    @Test
    public  void t1() {
        //创建被代理的目标类对象
        TargetInterFace t1=new Target();
        //使用目标类对象创建代理类对象
        TargetInterFace jdkProxy=new JDKProxy(t1);

        jdkProxy.method();
    }

    //使用jdk动态代理实现功能的增加
    @Test
    public void t2(){
        //创建目标对象
        Target target = new Target();
        //创建代理对象

        //准备加载目标类的类加载器
        ClassLoader targetClassLoader = target.getClass().getClassLoader();
        //准备目标类实现的接口对象
        Class<?>[] targetInterfaces = target.getClass().getInterfaces();
        //准备代理额外实现的方法
        InvocationHandler invocationHandler = new InvocationHandler() {
            /**
             *
             * @param proxy 创建代理对象
             * @param method 被代理的方法
             * @param args 被代理方法的参数
             * @return 返回方法本身的返回值
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("方法执行前添加");
                Object invoke = method.invoke(target, args);//执行目标类原方法
                System.out.println("方法执行后添加");
                return invoke;

            }
        };
        TargetInterFace proxy = (TargetInterFace) Proxy.newProxyInstance(targetClassLoader, targetInterfaces, invocationHandler);
        proxy.method();

    }

}
